什麼是黑箱測試呢? 就是不管程式內部的結構來進行測試的作法. 在這個測試過程中, 著重於 確認程式是否根據功能規格來運作, 所以又稱為 功能測試 (Functional Testing) 或是 行為測試 (Behavioral Testing).
黑箱測試方法是目前最通用, 最可行的測試方法. 主要是時間有限, 這個方法可以很快上手. 另外則是可以幫忙測試的人, 很多人是看不懂程式碼. 因此黑箱測試方法就變成首選.
黑箱測試方法可以應用到的場景很廣, 可以應用到以下測試階段
• 單元測試
• 整合測試
• 系統測試
• 驗收測試
在不同測試階段使用黑箱測試, 差別只是在於用起來有多困難. 有些階段或是場景用這種方法開立測試很容易, 有些階段用這些方法不容易. 例如: 在單元測試階段, 因為程式碼較少, 不看程式碼也容易準備. 在整合或是系統測試階段, 如果有 bug 修復, 這時候不看程式碼去進行迴歸測試, 用黑箱測試方法就是亂槍打鳥, 容易不精準.
黑箱測試的作法非常多, 至少看過十幾種, 因為時間和篇幅有限, 我就挑幾個比較常見的來介紹. 其實這些方法很多人都用過, 只是大家不知道它的名稱.
Equivalence Class Testing
Equivalence Class Testing 將受測單元的輸或是輸出資料, 劃分出幾個等價類別分割(partition). 原則上, 每個分割至少會開立一個測試個案來涵蓋. 這些分割基本上是獨立, 彼此不會相互影響. (如下圖 9-1 所示)
圖 9-1 Equivalence Class Testing 觀念示意圖
利用這種方法, 可以減少需要建立的測試個案總數, 讓測試軟體所需的時間也減少. 但是這樣的涵蓋率還算可靠, 因為每個分割都有測試案例.
我們來看個案例: 有個函式 F1 (int A, int B, Int C), 他會讀入三角形的三邊長 A, B, C, 然後判斷他是一個怎樣的三角形. 所以他的輸出可能是: 正三角形, 等腰三角形, 普通三角形 和 不是三角形.
圖 9-2 Equivalence Class Testing 的測試案例
根據 Equivalence Class Testing 的作法, 你可以利用輸出的部分, 找出以下這幾個分割, 每個分割我們至少有一個測試個案來涵蓋.
所以看到這邊, 可能會有人覺得這個方法的關鍵, 就是在找出分割. 沒錯, 厲害和不厲害的測試人員, 差別就在這裡. 有些測試人員有豐富的經驗或者是領域知識, 他可以展開的分割就非常詳盡.
拿上面這個三角形的函式來說, 沒經驗的可能就上面所示, 分成合法的 3 個分割, 和不合法的 1 個分割.
有經驗的人在不合法的部分, 他還會展開更多的分割, 例如:
• 小數點
• 字元
• 特殊符號
• 中文字
• 不是只有 3 個輸入
• 超過邊界值
你看這樣完整度就不一樣. 這邊不容易可以教會. 可以用 checking list 和加強領域知識來輔助.
Boundary Values Testing
Boundary Values Testing 是根據變數的邊界來開立測試個案. 如下圖 9-3 所示, 假設有一個變數, 他的邊界是 a 和 b, 這時候你可以開出以下幾個測試個案:
• 邊界 a
• 邊界 b
• 邊界 a 和 邊界 b 中間找一個
• 比 邊界 a 小一點
• 比 邊界 a 大一點
• 比 邊界 b 小一點
• 比 邊界 b 大一點
簡單吧, 只要有邊界, 你可以閉著眼睛就開出這7類測試個案.
圖 9-3 Boundary Values Testing 的開立測試個案方向
為什麼我們會想利用 Boundary Values Testing 的作法, 最主要的原因是受測系統很多問題都是出現邊界狀況. 另外則是開發人員大多只考慮 happy case, 對於邊界狀況不是沒空處理, 要不是就忘了. 因此, 測這部分往往投資報酬率很高, 很容易就可以抓出很多問題.
Decision Table Testing
Decision Table Testing 是用於測試不同輸入組合的系統行為. 他算是一種很系統化的方法, 把不同的輸入組合, 及其相應的系統行為, 以表格形式來呈現組合的狀況. 所以這方法也被稱為因果表格(Cause-Effect Table).
如下圖 9-4 所示, 這個表格會分成上半部和下半部. 上半部就是一堆 condition, 就是一些輸入的條件, 或是可能處理的狀況. 這裡可以利用前面提到的 Equivalence Class Testing 來找出可能的條件, 或者是 Boundary Values Testing 的值也可以. 所以 Decision Table Testing 可以整合Equivalence Class Testing 和 Boundary Values Testing 方法一起使用.
下半部是代表受測系統的行為或是輸出. 當他接受了上半部的資料或行為條件, 他會哪些反應.
這個表格的每個欄位(column) 就是你要測試的一個測試個案或場景.
這個方法厲害的地方, 是將你的測試想法給視覺化, 別人可以很容易知道你想怎麼測, 然後他就比較容易給你回饋, 看看哪邊需要加強. 因此, 強烈建議對於主要功能, 可以利用此方法來開立測試個案.
圖 9-4 Decision Table Testing 的解說
讓我們來看一個案例: 一家公司在販賣商品, 會根據以下狀況給優惠:
• 如果訂貨超過 50 個, 可以打 2% 的折扣
• 如果付現, 可以打 2% 的折扣
• 如果是批發商, 可以打 2% 的折扣
根據 Decision Table Testing 的作法, 你可以建立出以下表格:
上半部的 condition 有: 買超過 50 個, 付現, 或是批發商等狀況
下半部的 action 會有: 沒打折, 2% 折扣, 4% 折扣, 6% 折扣
每個 column 就是你會需要測試的場景